home *** CD-ROM | disk | FTP | other *** search
-
-
- /* *************************************************************
- DSAT.C Dynamic String Array Test
- Version 1.0
- Created by: Anthony Whitford
- (c) 1990
- ********************************************************* */
-
- #include <process.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- typedef char ** ptrarray_t;
-
- int wordcount (const char *);
- int str_to_ptrarray (const char *, char ***);
- void free_ptrarray (char ***);
-
- void main (void)
- {
- int numofitems, retval;
- ptrarray_t strlist;
- if ((retval = str_to_ptrarray("This is a test.", &strlist)) == -1)
- printf("Error turning the string into a pointer list.");
- else
- {
- /* Test the data. */
- printf("\nString list outside function...\n");
- for (numofitems = 0; strlist[numofitems] !=NULL; numofitems++)
- {
- printf("%u --> ***%s***\n",
- numofitems, strlist[numofitems]);
- }
- puts("");
- free_ptrarray(&strlist); /* Free pointer array. */
- }
- exit (retval); /* Return number of words or error. */
- }
-
- /* ****************************************************************
- Function: wordcount
- Parameters: const char *str -> the string.
- Description: Counts the number of words in a string up to
- 255 bytes.
- Returns: The number of words in astring.
- ************************************************************* */
-
- int wordcount (const char *str)
- {
- int words = 1; /* Initialize word cunt. */
- char tstr[256]; /* Declare a temporary string. */
- strcpy(tstr, str); /* Make a working copy. */
- if (strtok(tstr, " ") == NULL) /* If string is only */
- return (0); /* spaces, return 0. */
- while (strtok(NULL, " ") !=NULL)
- words++; /* Count how many words. */
- return (words); /* Return number of words in string. */
- }
-
- /* ************************************************************
- Function: str_to_ptrarray
- Parameters: const char *orgstr -> the original string
- to be parsed,
- char ***ptrarray -> the address ofthe
- pointer array.
- Description: Breaks a string into its words and composes
- a pointer array of the words.
- Returns: "ptrarray" becomes a NULL terminating pointer
- array, and pointer array, or -1 if an error
- occurred.
- ******************************************************** */
-
- int str_to_ptrarray (const char *orgstr, char ***ptrarray)
- {
- unsigned index = 0, words;
- char *cptr,*thestr;
- if (( thestr = (char *) calloc((size_t)(strlen(orgstr) + 1),
- sizeof(*thestr))) == NULL)
- return (-1); /* Make a working copy of the
- string. */
- strcpy(thestr, orgstr);
- words = wordcount(thestr); /* Get number of words. */
- if ((*ptrarray = (char **) calloc(words + 1,
- (size_t) sizeof(**ptrarray))) ==NULL)
- {
- free(thestr);
- return (-1); /* Error allocating space for
- ptrarray.*/
- }
-
- /* THIS IS A NEW PRINTF */
- for (index = 0; index < words; index ++)
- {
- printf("\n & *ptrarray[index] %x & (*ptrarray)[index] %x",
- ptrarray[index], &((*ptrarray)[index]));
- }
- index = 0;
-
- cptr = strtok(thestr, " ");
- while (index < words)
- {
- if ((*ptrarray[index] = (char *)calloc((size_t)(strlen(cptr) + 1),
- sizeof(**ptrarray[index]))) == NULL)
- {
- free_ptrarray(ptrarray);
- free(thestr); /* If memory allocation
- error, free */
- return (-1); /* thestr, ptrarray, and
- return -1. */
- }
- strcpy(*ptrarray[index++], cptr);
- cptr = strtok (NULL, " ");
- }
- *ptrarray[index] = NULL; /* Terminate ptrarray with a NULL. */
- free(thestr); /* Free allocated memory. */
- /* Test the data. --- Delete the next four lines when
- debugged!! */
- printf("\nString list inside function...\n");
- for (index = 0; *ptrarray[index] != NULL; index++)
- printf("%u --> ***%s***\n", index, *ptrarray[index]);
- puts(" ");
-
- return (words); /* Return the number of pointers. */
- }
-
- /* ************************************************************
- Function: free_ptrarray
- Parameters: char ***ptrarray _> address ofthe pointer
- array.
- Description: Frees allocated memory for the pointer array
- allocated with the str_to_ptrarray function.
- Returns: Nothing.
- ******************************************************* */
- void free_ptrarray (char ***ptrarray)
- {
- unsigned count = 0; /* Declare and reset counter. */
- for (; *ptrarray[count] != NULL; count++)
- free(*ptrarray[count]); /* Free each string/word. */
- free(*ptrarray); /* Free the handle. */
- }
-
-
-